package com.chinalcoal.ai.utils.util;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * 图片转PDF工具类
 * 使用Apache PDFBox库实现图片文件转换为PDF
 */
public class ImageToPdf {

    public static void main(String[] args) throws IOException {
        ImageToPdf.convertImageToPdf("G:\\我的项目\\PDF转图片\\pdfToImage\\教育部学籍在线验证报告_史晓坤.png", "G:\\我的项目\\PDF转图片\\pdfToImage\\教育部学籍在线验证报告_史晓坤.PDF");
        System.out.println("-------执行成功！");
    }

    /**
     * 将单张图片转换为PDF文件
     *
     * @param imageFilePath 图片文件路径
     * @param outputPdfPath 输出PDF文件路径
     * @throws IOException 当文件读写异常时抛出
     */
    public static void convertImageToPdf(String imageFilePath, String outputPdfPath) throws IOException {
        // 创建新的PDF文档
        try (PDDocument document = new PDDocument()) {
            // 加载图片
            PDImageXObject image = PDImageXObject.createFromFile(imageFilePath, document);

            // 创建新页面，页面大小根据图片尺寸设置
            PDPage page = new PDPage();
            document.addPage(page);

            // 创建内容流，用于向页面添加内容
            try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                // 计算图片在页面上的位置，使其居中
                float pageWidth = page.getMediaBox().getWidth();
                float pageHeight = page.getMediaBox().getHeight();
                float imageWidth = image.getWidth();
                float imageHeight = image.getHeight();

                // 计算缩放比例，确保图片完整显示在页面上
                float scale = Math.min(pageWidth / imageWidth, pageHeight / imageHeight);
                float scaledWidth = imageWidth * scale;
                float scaledHeight = imageHeight * scale;

                // 计算居中位置
                float x = (pageWidth - scaledWidth) / 2;
                float y = (pageHeight - scaledHeight) / 2;

                // 将图片绘制到页面上
                contentStream.drawImage(image, x, y, scaledWidth, scaledHeight);
            }

            // 保存PDF文件
            document.save(outputPdfPath);
        }
    }

    /**
     * 将多张图片转换为一个PDF文件，每张图片作为单独一页
     *
     * @param imageFilePaths 图片文件路径列表
     * @param outputPdfPath  输出PDF文件路径
     * @throws IOException 当文件读写异常时抛出
     */
    public static void convertImagesToPdf(List<String> imageFilePaths, String outputPdfPath) throws IOException {
        // 创建新的PDF文档
        try (PDDocument document = new PDDocument()) {
            // 遍历所有图片文件
            for (String imageFilePath : imageFilePaths) {
                // 加载图片
                PDImageXObject image = PDImageXObject.createFromFile(imageFilePath, document);

                // 创建新页面，页面大小根据图片尺寸设置
                PDPage page = new PDPage();
                document.addPage(page);

                // 创建内容流，用于向页面添加内容
                try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                    // 计算图片在页面上的位置，使其居中
                    float pageWidth = page.getMediaBox().getWidth();
                    float pageHeight = page.getMediaBox().getHeight();
                    float imageWidth = image.getWidth();
                    float imageHeight = image.getHeight();

                    // 计算缩放比例，确保图片完整显示在页面上
                    float scale = Math.min(pageWidth / imageWidth, pageHeight / imageHeight);
                    float scaledWidth = imageWidth * scale;
                    float scaledHeight = imageHeight * scale;

                    // 计算居中位置
                    float x = (pageWidth - scaledWidth) / 2;
                    float y = (pageHeight - scaledHeight) / 2;

                    // 将图片绘制到页面上
                    contentStream.drawImage(image, x, y, scaledWidth, scaledHeight);
                }
            }

            // 保存PDF文件
            document.save(outputPdfPath);
        }
    }

    /**
     * 将指定目录下的所有图片文件合并为一个PDF文件
     *
     * @param imageDirectory 图片文件所在目录路径
     * @param outputPdfPath  输出PDF文件路径
     * @param imageExtension 图片文件扩展名（如".jpg", ".png"等）
     * @throws IOException 当文件读写异常时抛出
     */
    public static void convertImagesInDirectoryToPdf(String imageDirectory, String outputPdfPath, String imageExtension) throws IOException {
        File directory = new File(imageDirectory);
        if (!directory.exists() || !directory.isDirectory()) {
            throw new IOException("指定路径不是有效目录: " + imageDirectory);
        }

        // 获取目录下所有指定扩展名的图片文件
        File[] imageFiles = directory.listFiles((dir, name) ->
                name.toLowerCase().endsWith(imageExtension.toLowerCase()));

        if (imageFiles == null || imageFiles.length == 0) {
            throw new IOException("目录中未找到扩展名为 " + imageExtension + " 的图片文件");
        }

        // 创建新的PDF文档
        try (PDDocument document = new PDDocument()) {
            // 遍历所有图片文件
            for (File imageFile : imageFiles) {
                // 加载图片
                PDImageXObject image = PDImageXObject.createFromFile(imageFile.getAbsolutePath(), document);

                // 创建新页面，页面大小根据图片尺寸设置
                PDPage page = new PDPage();
                document.addPage(page);

                // 创建内容流，用于向页面添加内容
                try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                    // 计算图片在页面上的位置，使其居中
                    float pageWidth = page.getMediaBox().getWidth();
                    float pageHeight = page.getMediaBox().getHeight();
                    float imageWidth = image.getWidth();
                    float imageHeight = image.getHeight();

                    // 计算缩放比例，确保图片完整显示在页面上
                    float scale = Math.min(pageWidth / imageWidth, pageHeight / imageHeight);
                    float scaledWidth = imageWidth * scale;
                    float scaledHeight = imageHeight * scale;

                    // 计算居中位置
                    float x = (pageWidth - scaledWidth) / 2;
                    float y = (pageHeight - scaledHeight) / 2;

                    // 将图片绘制到页面上
                    contentStream.drawImage(image, x, y, scaledWidth, scaledHeight);
                }
            }

            // 保存PDF文件
            document.save(outputPdfPath);
        }
    }
}
